home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / wintool.cls < prev    next >
Text File  |  1997-06-14  |  11KB  |  349 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "GWinTool"
  6. Attribute VB_GlobalNameSpace = True
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorWinTool
  13.     eeBaseWinTool = 13640   ' WinTool
  14. End Enum
  15.  
  16. #If fComponent Then
  17. Sub SetRedraw(ctl As Object, f As Boolean)
  18. #Else
  19. Sub SetRedraw(ctl As Control, f As Boolean)
  20. #End If
  21.     Call SendMessageVal(ctl.hWnd, WM_SETREDRAW, -CLng(f), 0&)
  22. End Sub
  23.  
  24. #If fComponent Then
  25. Function LookupItemData(ctl As Object, data As Long) As Integer
  26. #Else
  27. Function LookupItemData(ctl As Control, data As Long) As Integer
  28. #End If
  29.     Dim i As Integer
  30.     LookupItemData = -1
  31.     For i = 0 To ctl.ListCount - 1
  32.         If data = ctl.ItemData(i) Then
  33.             LookupItemData = i
  34.             Exit Function
  35.         End If
  36.     Next
  37. End Function
  38.  
  39. #If fComponent Then
  40. Function LookupItem(ctl As Object, sItem As String) As Long
  41. #Else
  42. Function LookupItem(ctl As Control, sItem As String) As Long
  43. #End If
  44.     If TypeName(ctl) = "ComboBox" Then
  45.         LookupItem = SendMessageStr(ctl.hWnd, CB_FINDSTRING, -1&, sItem)
  46.     Else
  47.         LookupItem = SendMessageStr(ctl.hWnd, LB_FINDSTRING, -1&, sItem)
  48.     End If
  49. End Function
  50.  
  51. Function ClassNameFromWnd(ByVal hWnd As Long) As String
  52.     Dim sName As String, cName As Integer
  53.     BugAssert hWnd <> hNull
  54.     sName = String$(80, 0)
  55.     cName = GetClassName(hWnd, sName, 80)
  56.     ClassNameFromWnd = Left$(sName, cName)
  57. End Function
  58.  
  59. Function InstFromWnd(ByVal hWnd As Long) As Long
  60.     BugAssert hWnd <> hNull
  61.     InstFromWnd = GetWindowLong(hWnd, GWL_HINSTANCE)
  62. End Function
  63.  
  64. Function ProcIDFromWnd(ByVal hWnd As Long) As Long
  65.     Dim idProc As Long
  66.     Call GetWindowThreadProcessId(hWnd, idProc)
  67.     ProcIDFromWnd = idProc
  68. End Function
  69.  
  70. Function ProcFromWnd(ByVal hWnd As Long) As Long
  71.     BugAssert hWnd <> hNull
  72.     ProcFromWnd = MModTool.ProcFromProcID(ProcIDFromWnd(hWnd))
  73. End Function
  74.  
  75. Function ThreadIDFromWnd(ByVal hWnd As Long) As Long
  76.     Dim idProc As Long
  77.     BugAssert hWnd <> hNull
  78.     ThreadIDFromWnd = GetWindowThreadProcessId(hWnd, idProc)
  79. End Function
  80.  
  81. Function GetWndOwner(ByVal hWnd As Long) As String
  82.     Dim hwndOwner As Long
  83.     BugAssert hWnd <> hNull
  84.     hwndOwner = GetWindow(hWnd, GW_OWNER)
  85.     If hwndOwner <> hNull Then
  86.         GetWndOwner = WindowTextLineFromWnd(hwndOwner)
  87.     Else
  88.         GetWndOwner = sEmpty
  89.     End If
  90. End Function
  91.  
  92. Function IsWindowLocal(ByVal hWnd As Long) As Boolean
  93.     Dim idWnd As Long
  94.     Call GetWindowThreadProcessId(hWnd, idWnd)
  95.     IsWindowLocal = (idWnd = GetCurrentProcessId())
  96. End Function
  97.  
  98. Function IsVisibleTopWnd(hWnd As Long, _
  99.                 Optional IgnoreEmpty As Boolean = False, _
  100.                 Optional IgnoreVisible As Boolean = False, _
  101.                 Optional IgnoreOwned As Boolean = False) _
  102.                 As Boolean
  103.     If IgnoreEmpty Or WindowTextFromWnd(hWnd) <> sEmpty Then
  104.         If IgnoreVisible Or IsWindowVisible(hWnd) Then
  105.             If IgnoreOwned Or GetWindow(hWnd, GW_OWNER) = hNull Then
  106.                 IsVisibleTopWnd = True
  107.             End If
  108.         End If
  109.     End If
  110. End Function
  111.  
  112. Function VBFindWindow(Optional Class As String, _
  113.                       Optional Title As String) As Long
  114.     VBFindWindow = FindWindow(Class, Title)
  115. End Function
  116.  
  117. Function WindowTextFromWnd(ByVal hWnd As Long) As String
  118.     Dim c As Integer, s As String
  119.     c = GetWindowTextLength(hWnd)
  120.     If c <= 0 Then Exit Function
  121.     s = String$(c, 0)
  122.     c = GetWindowText(hWnd, s, c + 1)
  123.     WindowTextFromWnd = s
  124. End Function
  125.  
  126. Function WindowTextLineFromWnd(ByVal hWnd As Long) As String
  127.     Dim sTitle As String, cTitle As Integer
  128.     sTitle = WindowTextFromWnd(hWnd)
  129.     ' Chop off end of multiline captions
  130.     cTitle = InStr(sTitle, sCr)
  131.     WindowTextLineFromWnd = IIf(cTitle, Left$(sTitle, cTitle), sTitle)
  132. End Function
  133.  
  134. Function VBFindTopWindow(sClass As String, sTitle As String) As Long
  135.                        
  136.     ' Assume fail for easy exit
  137.     VBFindTopWindow = hNull
  138.     If sClass = sEmpty And sTitle = sEmpty Then Exit Function
  139.  
  140.     ' Get first sibling to start iterating top level windows
  141.     Dim fClass As Boolean, fTitle As Boolean
  142.     Dim hWnd As Long
  143.     hWnd = GetWindow(GetDesktopWindow(), GW_CHILD)
  144.     Do While hWnd <> hNull
  145.         
  146.         ' Check class
  147.         fClass = True
  148.         If sClass <> sEmpty Then
  149.             fClass = (StrComp(sClass, ClassNameFromWnd(hWnd)) = 0)
  150.         End If
  151.         
  152.         ' Check title
  153.         fTitle = True
  154.         If sTitle <> sEmpty Then
  155.             fTitle = (WindowTextFromWnd(hWnd) Like sTitle)
  156.         End If
  157.  
  158.         ' Check success
  159.         If fClass And fTitle Then
  160.             VBFindTopWindow = hWnd
  161.             Exit Function
  162.         End If
  163.  
  164.         ' Get next sibling
  165.         hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  166.     Loop
  167.  
  168. End Function
  169.  
  170. Sub ChangeStyleBit(hWnd As Long, f As Boolean, afNew As Long)
  171.     Dim af As Long, hParent As Long
  172.     af = GetWindowLong(hWnd, GWL_STYLE)
  173.     If f Then
  174.         af = af Or afNew
  175.     Else
  176.         af = af And (Not afNew)
  177.     End If
  178.     Call SetWindowLong(hWnd, GWL_STYLE, af)
  179.     ' Reset the parent so that change will "take"
  180.     hParent = GetParent(hWnd)
  181.     SetParent hWnd, hParent
  182.     ' Redraw for added insurance
  183.     Call SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
  184.                       SWP_NOZORDER Or SWP_NOSIZE Or _
  185.                       SWP_NOMOVE Or SWP_DRAWFRAME)
  186. End Sub
  187.  
  188. Function GetStyleBits(hWnd As Long) As Long
  189.     GetStyleBits = GetWindowLong(hWnd, GWL_STYLE)
  190. End Function
  191.  
  192. Sub ChangeExtStyleBit(hWnd As Long, f As Boolean, afNew As Long)
  193.     Dim af As Long, hParent As Long
  194.     af = GetWindowLong(hWnd, GWL_EXSTYLE)
  195.     If f Then
  196.         af = af Or afNew
  197.     Else
  198.         af = af And (Not afNew)
  199.     End If
  200.     Call SetWindowLong(hWnd, GWL_EXSTYLE, af)
  201.     ' Reset the parent so that change will "take"
  202.     hParent = GetParent(hWnd)
  203.     SetParent hWnd, hParent
  204.     ' Redraw for added insurance
  205.     Call SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
  206.                       SWP_NOZORDER Or SWP_NOSIZE Or _
  207.                       SWP_NOMOVE Or SWP_DRAWFRAME)
  208. End Sub
  209.  
  210. Function GetExtStyleBits(hWnd As Long) As Long
  211.     GetExtStyleBits = GetWindowLong(hWnd, GWL_EXSTYLE)
  212. End Function
  213.  
  214. ' Something that uses ChangeStyleBit
  215.  
  216. Sub SetClipControls(hWnd As Long, f As Boolean)
  217.     ' You want to do this:
  218.     'Me.ClipControls = f
  219.     ' But Visual Basic won't let you; do this instead:
  220.     ChangeStyleBit hWnd, f, WS_CLIPCHILDREN
  221. End Sub
  222.     
  223. Sub ClientToScreenXY(ByVal hWnd As Long, x As Long, y As Long)
  224.     Dim pt As POINTL
  225.     pt.x = x \ Screen.TwipsPerPixelX
  226.     pt.y = y \ Screen.TwipsPerPixelY
  227.     ClientToScreen hWnd, pt
  228.     x = pt.x
  229.     y = pt.y
  230. End Sub
  231.         
  232. Function GetWndStyle(hWnd) As String
  233.     Dim af As Long, s As String
  234.     BugAssert hWnd <> hNull
  235.  
  236.     ' Get normal style
  237.     af = GetWindowLong(hWnd, GWL_STYLE)
  238.     If af And WS_BORDER Then s = s & "Border "
  239.     If af And WS_CAPTION Then s = s & "Caption "
  240.     If af And WS_CHILD Then s = s & "Child "
  241.     If af And WS_CLIPCHILDREN Then s = s & "ClipChildren "
  242.     If af And WS_CLIPSIBLINGS Then s = s & "ClipSiblings "
  243.     If af And WS_DLGFRAME Then s = s & "DlgFrame "
  244.     If af And WS_GROUP Then s = s & "Group "
  245.     If af And WS_HSCROLL Then s = s & "HScroll "
  246.     If af And WS_MAXIMIZEBOX Then s = s & "MaximizeBox "
  247.     If af And WS_MINIMIZEBOX Then s = s & "MinimizeBox "
  248.     If af And WS_POPUP Then s = s & "Popup "
  249.     If af And WS_SYSMENU Then s = s & "SysMenu "
  250.     If af And WS_TABSTOP Then s = s & "TabStop "
  251.     If af And WS_THICKFRAME Then s = s & "ThickFrame "
  252.     If af And WS_VSCROLL Then s = s & "VScroll "
  253.  
  254.     ' Get extended style
  255.     af = GetWindowLong(hWnd, GWL_EXSTYLE)
  256.     If af And WS_EX_DLGMODALFRAME Then s = s & "DlgModalFrame "
  257.     If af And WS_EX_NOPARENTNOTIFY Then s = s & "NoParentNotify "
  258.     If af And WS_EX_TOPMOST Then s = s & "Topmost "
  259.     If af And WS_EX_ACCEPTFILES Then s = s & "AcceptFiles "
  260.     If af And WS_EX_TRANSPARENT Then s = s & "Transparent "
  261.  
  262.     GetWndStyle = s
  263.  
  264. End Function
  265.  
  266. Public Function GetWndInfo(ByVal hWnd As Long, Optional TabStop As Integer = 0) As String
  267.     Dim sStart As String, s As String, sTemp As String
  268.     BugAssert hWnd <> hNull
  269.     
  270.     ' Nested starting position
  271.     sStart = Space$(TabStop * 4)
  272.     ' Window information
  273.     sTemp = WindowTextLineFromWnd(hWnd)
  274.     'sTemp = WindowTextFromWnd(hWnd)
  275.     If sTemp = sEmpty Then sTemp = "[none]"
  276.     s = sStart & "Title: " & sTemp & sCrLf
  277.     s = s & sStart & "Class: " & ClassNameFromWnd(hWnd) & sCrLf
  278.     s = s & sStart & "Style: " & GetWndStyle(hWnd) & sCrLf
  279.     sTemp = GetWndOwner(hWnd)
  280.     If sTemp <> sEmpty Then
  281.         s = s & sStart & "Owner: " & sTemp & sCrLf
  282.     End If
  283.  
  284.     GetWndInfo = s
  285.  
  286. End Function
  287.  
  288. Public Function GetWndView(hWnd) As String
  289.     Dim s As String
  290.     BugAssert hWnd <> hNull
  291.     s = IIf(IsWindowVisible(hWnd), "Visible ", "Invisible ")
  292.     s = s & IIf(IsWindowEnabled(hWnd), "Enabled", "Disabled ")
  293.     s = s & IIf(IsZoomed(hWnd), "Zoomed ", sEmpty)
  294.     s = s & IIf(IsIconic(hWnd), "Iconic ", sEmpty)
  295.     GetWndView = s
  296. End Function
  297.  
  298. Function GetTextExtentWnd(ByVal hWnd As Long, s As String, _
  299.                      Optional dy As Single) As Single
  300.                      
  301.     Dim hDC As Long, sz As SIZEL, f As Long
  302.     hDC = GetDC(hWnd)
  303.     f = GetTextExtentPoint32(hDC, s, Len(s), sz)
  304.     If f Then
  305.         ' Most common x value in return
  306.         GetTextExtentWnd = sz.cx
  307.         ' Optional y value through reference variable
  308.         dy = sz.cy
  309.     End If
  310.     Call ReleaseDC(hWnd, hDC)
  311.                      
  312. End Function
  313.  
  314. Property Get WindowsDir() As String
  315.     Dim s As String, c As Long
  316.     s = String$(cMaxPath, 0)
  317.     c = GetWindowsDirectory(s, cMaxPath)
  318.     WindowsDir = Left(s, c)
  319. End Property
  320.  
  321. Property Get SystemDir() As String
  322.     Dim s As String, c As Long
  323.     s = String$(cMaxPath, 0)
  324.     c = GetSystemDirectory(s, cMaxPath)
  325.     SystemDir = Left(s, c)
  326. End Property
  327. '
  328.  
  329. #If fComponent = 0 Then
  330. Private Sub ErrRaise(e As Long)
  331.     Dim sText As String, sSource As String
  332.     If e > 1000 Then
  333.         sSource = App.ExeName & ".WinTool"
  334.         Select Case e
  335.         Case eeBaseWinTool
  336.             BugAssert True
  337.        ' Case ee...
  338.        '     Add additional errors
  339.         End Select
  340.         Err.Raise COMError(e), sSource, sText
  341.     Else
  342.         ' Raise standard Visual Basic error
  343.         sSource = App.ExeName & ".VBError"
  344.         Err.Raise e, sSource
  345.     End If
  346. End Sub
  347. #End If
  348.  
  349.